這一篇我們來小結一下單元測試的重點,下個單元將正式進入Android的測試。
JUnit
- JUnit是一個用在Java、Kotlin的單元測試框架。
用來驗證被測試物件的方式
- 驗證回傳值
- 驗證物件狀態的改變
- 驗證目標與相依物件的互動
依賴注入
- 而當我們在測試時,遇到外部相依無法預期結果時,可以透過依賴注入的方式處理。
Injection 的種類
- Method injection
- Constructor injection
- Property injection
- Ambient context
假物件
- Stub:用來模擬外部相依物件的回傳結果。
- Mock:用來驗證目標與相依物件的互動。
我們來看一下好的單元測試應該有哪些要注意的。
單元測試的FIRST原則
Fast:快速
- 單元測試的執行速度必須要,快才不會打亂你的開發節奏。如果不快,就不會經常地執行它們。
Independent:獨立
- 測試案例之間相依性為零。每一個測試,都只做跟自已有關的事。
- 不同測試的先後順序不應有所差異。如果要先跑A測試之後,B測試才能正常通過測試就是不好的測試。
- 不與外部(包括檔案、資料庫、網路、服務、物件等等)直接相依。當看到紅燈,一定是被測試的方法寫錯,而不是其他原因。例如網路壞、機器問題。
- 避免Flaky test,因為別人的錯誤而導致測試失敗。
Repeatable:可重複
- 例如重覆使用被測試物件,就可能造成測試不是每次都有一樣的結果。基本上,如果你有做到Independent的話,測試應該可被重覆執行的。
- 由團隊裡任何人重複執行測試都應得到一樣的結果。
Self-Validating:自我驗證
- 從測試結果應能直接了解失敗的原因。你不能在收到測試失敗後,還需要再修改Production Code或Testing Code才能知道錯誤的原因。
Timely:及時
- 寫測試要及時。最好是使用TDD的方式來開發,先寫Testing Code再寫Production Code。如沒有TDD,最晚也要在commit 之前要寫完測試。
測試不該有條件式判斷
當你的測試如果有條件式判斷,代表你可能會有其中一個條件不會被執行到。
不具備邏輯
測試應該要很簡單,簡單到一出錯,你不用debug,你直接看就知道哪裡錯。測試程式應只是描述一件事,儘量不要有for迴圈等複雜的邏輯。
準備開始Android測試
第一單元「單元測試基本概念」,就到這篇告一個段落。大家應該對於如何寫單元測試有了初步的了解,下一篇開始我們就開始進入到Android的單元測試。